package com.toe.forum.service;

import com.toe.pojo.dto.forum.ArticleAddDTO;
import com.toe.pojo.dto.forum.ArticleUpdateDTO;
import com.toe.pojo.entity.forum.ForumArticle;
import com.baomidou.mybatisplus.extension.service.IService;
import com.toe.pojo.vo.forum.ArticleDetailVO;
import com.toe.pojo.vo.forum.ArticleSimpleVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
/**
 * <p>
 * 文章表 服务类
 * </p>
 *
 * @author 陶涛
 * @since 2022-07-19
 */
public interface ForumArticleService extends IService<ForumArticle> {
    /**
     * 缓存预热
     */
    void prepareLoad();

    /**
     * 添加文章
     * @param articleAddDTO
     */
    @Transactional
    void insert(ArticleAddDTO articleAddDTO);

    /**
     * 删除文章
     * @param id
     */
    @Transactional
    void deleteById(long id);

    /**
     * 修改文章
     * @param articleUpdateDTO
     */
    @Transactional
    void updateArticle(ArticleUpdateDTO articleUpdateDTO);

    /**
     * 查询所有的文章
     * @return
     */
    List<ArticleDetailVO> selectAllArticle();

    /**
     * 分页查询所有的文章
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<ArticleDetailVO> selectAllArticlePage(Integer pageNum,Integer pageSize);

    /**
     * 通过分类ID查询该分类的全部的文章
     * @return
     */
    List<ArticleDetailVO> selectAllArticleByCategoryId(long categoryId);

    /**
     * 通过分类ID分页查询该分类的全部的文章
     * @param categoryId
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<ArticleDetailVO> selectAllArticleByCategoryIdPage(long categoryId,Integer pageNum,Integer pageSize);

    /**
     * 查询某个作者的全部文章
     * @param authorId
     * @return
     */
    List<ArticleDetailVO> selectAllArticleByAuthorId(long authorId);

    /**
     * 分页查询某个作者的全部文章
     * @param authorId
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<ArticleDetailVO> selectAllArticleByAuthorIdPage(long authorId,Integer pageNum,Integer pageSize);

    /**
     * 查询当前用户点赞过的文章
     * @return
     */
    List<ArticleDetailVO> selectAllArticleByUserLike();

    /**
     * 分页查询当前用户点赞过的文章
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<ArticleDetailVO> selectAllArticleByUserLikePage(Integer pageNum,Integer pageSize);

    /**
     * 查询当前用户收藏过的文章
     * @return
     */
    List<ArticleDetailVO> selectAllArticleByUserEnshrine();

    /**
     * 分页查询当前用户收藏过的文章
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<ArticleDetailVO> selectAllArticleByUserEnshrinePage(Integer pageNum,Integer pageSize);

    /**
     * 查询当前用户正在审核的文章
     * @return
     */
    List<ArticleDetailVO> selectAllArticleInCheck();

    /**
     * 通过id查询具体的文章
     * @param id
     * @return
     */
    ArticleDetailVO selectArticleById(long id);

    /**
     * 更新文章的状态,即是否被举报
     * @param id
     * @param state
     */
    void updateArticleIsReport(long id,Integer state);

    /**
     * 管理员审核被举报文章
     * @param id
     * @param state
     */
    void adminUpdateArticleIsReport(long id,Integer state);

    /**
     * 管理员审核通过刚发表的文章
     * @param id
     */
    void adminCheckArticlePass(long id);

    /**
     * 管理员审核不通过刚发表的文章
     * @param id
     */
    void adminCheckArticleFail(long id);

    /**
     * 当前用户点赞文章
     * @param articleId
     */
    void likeArticle(long articleId);

    /**
     * 当前用户收藏文章
     * @param articleId
     */
    void enshrineArticle(long articleId);

    /**
     * 查询当前用户点赞的文章数量
     * @return
     */
    int selectCurrentLikeCount();

    /**
     * 查询当前用户收藏的文章数量
     * @return
     */
    int selectCurrentEnshrineCount();

    /**
     * (管理员)批量删除文章
     * @return
     */
    void deleteArticleByIds(Long... ids);
}
